import SockJS from 'sockjs-client';
import Stomp from 'stompjs';
/**
 * 建立websocket连接
 * @param {string} url ws地址
 */

var stompClient, mySocket;
let webSocketMsg = '/websocket';
let topicIds = [1, 2];
let groupIds = [1, 2];
let ws = function () {};

function sockHandle() {
  // 连接成功后的回调函数
  mySocket.onopen = function () {
    console.log('------连接成功------');
  };

  // 监听接受到服务器的消息
  mySocket.onmessage = function (event) {};

  // 关闭连接的回调函数
  mySocket.onclose = function (event) {
    console.log('--------关闭连接: connection closed.------');
  };

  // 连接发生错误
  mySocket.onerror = function () {
    alert('连接错误', '网络超时或通讯地址错误.');
  };
}

ws.prototype = {
  concat: (url, token) => {
    mySocket = new SockJS(url, null, { timeout: 15000 });
    sockHandle();
    stompClient = Stomp.over(mySocket);

    stompClient.heartbeat.outgoing = 5000;
    stompClient.heartbeat.incoming = 0;

    stompClient.connect({ token: '0000031' }, function () {
      console.log('=====----webSocket连接成功');
      /*
       * 1. 订阅服务，订阅地址为服务器Controller 中的地址
       * 2. 如果订阅为公告，地址为Controller 中@SendTo 注解地址
       * 3. 如果订阅为私信，地址为setUserDestinationPrefix 前缀+@SendToUser注解地址
       *    或者setUserDestinationPrefix 前缀 + controller的convertAndSendToUser地址一致
       * 4. 这里演示为公告信息，所有订阅了的用户都能接受
       */
      stompClient.subscribe('/topic/everyTopic', function (message) {
        var msg = JSON.parse(message.body).msg;
        alert('接收到公告信息：' + msg);
      });

      /*
       * 1. 因为推送为私信，必须带上或者setUserDestinationPrefix前缀 /user
       * 2. 演示自己发送给自己，做websocket向服务器请求资源而已，然后服务器你就把资源给我就行了，
       *    别的用户就不用你广播推送了，简单点，就是我请求，你就推送给我
       */
      stompClient.subscribe('/user/alone/toMe', function (message) {
        var msg = JSON.parse(message.body).msg;
        alert('接收到私信信息SendToUser：' + msg);
      });
      /*
       * 1. 订阅点对点消息
       * 2. 很多博文这里的路径会写成"/user/{accountId}/userTest/callBack”这种，是因为
       *    @SendToUser发送的代理地址是 /userTest/callBack， 地址将会被转化为 /user/{username}/userTest/callBack
       *    username，为用户的登录名，也是就是Principal或者本文中的WebSocketUserAuthentication对象getName获取的参数
       *    如果在拦截器中配置了认证路径，可以不带参数，不过推荐用带参数的写法
       */
      stompClient.subscribe('/user/alone/toFriend', function (message) {
        var msg = message.body;
        alert('接收到点对点SendToUser：' + msg);
      });

      topicIds.forEach(function (item, index) {
        stompClient.subscribe('/topic/topicId/' + item, function (message) {
          var msg = JSON.parse(message.body).msg;
          console.log('接收到公告信息：' + msg);
          alert('接收到公告信息：' + msg);
        });
      });

      groupIds.forEach(function (item, index) {
        stompClient.subscribe('/mass/toGroup/' + item, function (message) {
          var msg = message.body;
          alert('接收到点对点群消息：' + msg);
        });
      });
    });
  },
  sendTopicMsg: () => {
    var data = { msg: 'sendTopicMsg' };
    var topicId = '1';
    /**
     *  1. 第一个参数 url 为服务器 controller中 @MessageMapping 中匹配的URL，字符串，必须参数；
     *  2. headers 为发送信息的header，json格式，JavaScript 对象，
     *     可选参数,可以携带消息头信息，也可以做事务，如果没有，传{}
     *  3. body 为发送信息的 body，字符串，可选参数
     *  4. accountId这个参数其实可以通过header传过去，不过因为是restful风格，所以就跟在url上
     */
    stompClient.send(webSocketMsg + '/sendTopicMsg/' + topicId, {}, JSON.stringify(data));
    console.log('sendTopicMsg');
  },
  sendGroupMsg: () => {
    var data = { msg: 'sendGroupMsg' };
    var groupId = '2';
    /**
     *  1. 第一个参数 url 为服务器 controller中 @MessageMapping 中匹配的URL，字符串，必须参数；
     *  2. headers 为发送信息的header，json格式，JavaScript 对象，
     *     可选参数,可以携带消息头信息，也可以做事务，如果没有，传{}
     *  3. body 为发送信息的 body，字符串，可选参数
     */
    stompClient.send(webSocketMsg + '/sendGroupMsg/' + groupId, {}, JSON.stringify(data));
  },
  sendMeMsg: () => {
    var data = { msg: 'sendMeMsg' };

    /**
     *  1. 第一个参数 url 为服务器 controller中 @MessageMapping 中匹配的URL，字符串，必须参数；
     *  2. headers 为发送信息的header，json格式，JavaScript 对象，
     *     可选参数,可以携带消息头信息，也可以做事务，如果没有，传{}
     *  3. body 为发送信息的 body，字符串，可选参数
     */
    stompClient.send(webSocketMsg + '/sendMeMsg', {}, JSON.stringify(data));
  },
  sendFriendMsg: () => {
    var data = { msg: 'msg' };
    var friendId = 'admin';
    /**
     *  1. 第一个参数 url 为服务器 controller中 @MessageMapping 中匹配的URL，字符串，必须参数；
     *  2. headers 为发送信息的header，json格式，JavaScript 对象，
     *     可选参数,可以携带消息头信息，也可以做事务，如果没有，传{}
     *  3. body 为发送信息的 body，字符串，可选参数
     */
    stompClient.send(webSocketMsg + '/sendFriendMsg/' + friendId, {}, JSON.stringify(data));
  },
};
export default ws;
